<?php

namespace app\admin\model;

use app\admin\constants\AdminConstants;
use think\facade\Cache;
use think\Model;
use think\facade\Db;

/**
 * Admin模型
 * @property int    $id              管理员ID
 * @property string $username        管理员用户名
 * @property string $nickname        管理员昵称
 * @property string $email           管理员邮箱
 * @property string $mobile          管理员手机号
 * @property string $last_login_ip   上次登录IP
 * @property string $last_login_time 上次登录时间
 * @property int    $login_failure   登录失败次数
 * @property string $password        密码密文
 * @property string $salt            密码盐（废弃待删）
 * @property string $status          状态:enable=启用,disable=禁用,...(string存储，可自定义其他)
 */
class Admin extends Model
{
    /**
     * @var string 自动写入时间戳
     */
    protected $autoWriteTimestamp = true;

    /**
     * 追加属性
     */
    protected $append = [
        'group_arr',
        'group_name_arr',
        'store_name_arr',
        'store_id_arr',
    ];

    public function getGroupArrAttr($value, $row): array
    {
        return Db::name('admin_group_access')
            ->where('uid', $row['id'])
            ->column('group_id');
    }

    public function getGroupNameArrAttr($value, $row): array
    {
        $groupAccess = Db::name('admin_group_access')
            ->where('uid', $row['id'])
            ->column('group_id');
        return AdminGroup::whereIn('id', $groupAccess)->column('name');
    }
    public function getStoreIdArrAttr($value, $row): array
    {
        return Db::name('admin_store_relation')
            ->where('admin_id', $row['id'])
            ->column('store_id');
    }

    public function getStoreNameArrAttr($value, $row): array
    {
        $storeAccess = Db::name('admin_store_relation')
            ->where('admin_id', $row['id'])
            ->column('store_id');
        if (empty($storeAccess)) {
            return [];
        }
        return Store::whereIn('id', $storeAccess)->column('name');
    }

    public function getAvatarAttr($value): string
    {
        return full_url($value, false, config('buildadmin.default_avatar'));
    }

    public function setAvatarAttr($value): string
    {
        return $value == full_url('', false, config('buildadmin.default_avatar')) ? '' : $value;
    }

    public function getLastLoginTimeAttr($value): string
    {
        return $value ? date('Y-m-d H:i:s', $value) : '';
    }

    /**
     * 获得登陆用户关联的门店id，用于查询相关数据时的条件限制
     * @param Auth $auth
     * @param string $searchField 查询相关数据时关联的能看到门店数据的哪个字段，默认store_id，即门店id
     * @return array
     */
    public static function getLoginAdminStores($searchField = 'id'): array
    {
        $loginAdmin = request()->adminAuth;
        // Cache::store('redis')->delete(AdminConstants::ADMIN_STORES_CACHE_KEY . $loginAdmin->id); //临时方便测试
        // 从缓存中获取门店数据
        $cacheData = Cache::store('redis')->get(AdminConstants::ADMIN_STORES_CACHE_KEY . $loginAdmin->id);
        if ($cacheData) {
            $cacheData = json_decode($cacheData, true);
            $cacheData['where'][0] = $searchField; //修改缓存中的查询条件，每个地方的查询字段可能不一样，以传入的为准
            return $cacheData;
        }

        // 超级管理员，返回全部门店
        if ($loginAdmin->isSuperAdmin()) {
            $returnData = ['where' => [$searchField, '>=', -1], 'adminStores' => Store::where('status', 1)->field('id,name')->select()->toArray()];
            Cache::store('redis')->set(AdminConstants::ADMIN_STORES_CACHE_KEY . $loginAdmin->id, json_encode($returnData), AdminConstants::ADMIN_STORES_CACHE_TIME); //缓存1天
            return $returnData;
        }

        $adminStores = $loginAdmin->stores->toArray(); //登陆用户关联的门店

        if (empty($adminStores) || count($adminStores) == 0) { //没有关联门店，返回无门店
            $returnData = ['where' => [$searchField, '=', -1], 'adminStores' => []];
            Cache::store('redis')->set(AdminConstants::ADMIN_STORES_CACHE_KEY . $loginAdmin->id, json_encode($returnData), AdminConstants::ADMIN_STORES_CACHE_TIME); //缓存1天
            return $returnData;
        }
        //将门店数据缓存到Redis
        $returnData = ['where' => [$searchField, 'in', array_map('intval', array_column($adminStores, 'id'))], 'adminStores' => $adminStores];
        Cache::store('redis')->set(AdminConstants::ADMIN_STORES_CACHE_KEY . $loginAdmin->id, json_encode($returnData), AdminConstants::ADMIN_STORES_CACHE_TIME); //缓存1天
        return $returnData;
    }

    /**
     * 重置用户密码
     * @param int|string $uid         管理员ID
     * @param string     $newPassword 新密码
     * @return int|Admin
     */
    public function resetPassword(int|string $uid, string $newPassword): int|Admin
    {
        return $this->where(['id' => $uid])->update(['password' => hash_password($newPassword), 'salt' => '']);
    }

    /**
     * 关联门店（多对多，通过admin_store_relation表）
     */
    public function stores(): \think\model\relation\BelongsToMany
    {
        return $this->belongsToMany(Store::class, 'admin_store_relation', 'store_id', 'admin_id')->where('store.status', 1);
    }


    /**
     * 关联创建的门店（一对多）
     */
    public function createdStores(): \think\model\relation\HasMany
    {
        return $this->hasMany(Store::class, 'admin_id', 'id');
    }

    /**
     * 关联创建的预约记录（一对多）
     */
    public function createdAppointments(): \think\model\relation\HasMany
    {
        return $this->hasMany(Appointment::class, 'admin_id', 'id');
    }

    /**
     * 关联创建的房间（一对多）
     */
    public function createdRooms(): \think\model\relation\HasMany
    {
        return $this->hasMany(Room::class, 'admin_id', 'id');
    }
}
